package data;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.List;

import dataTransferObject.Destino;
import dataTransferObject.Lugar;
import dataTransferObject.Parque;
import dataTransferObject.Tienda;
import dataTransferObject.Veterinario;


public class JDBCDestinoDAO implements IDestinoDAO{

	private IUbicacionDAO ubicacionDAO;
	private IMascotaDAO mascotaDAO;
	
	public JDBCDestinoDAO(){
		 ubicacionDAO= new JDBCUbicacionDAO();
		 mascotaDAO= new JDBCMascotaDAO();
	}
	
	
	public List<Destino> selectDestino(Connection conn,int idUsuario) {

		List<Destino> lista= new ArrayList<Destino>();
		Destino destino=null;
		
		PreparedStatement stat=null;
		ResultSet resultSet=null;
		String sql="SELECT * FROM petsociety.destino destino,petsociety.lugar lugar, petsociety.zona zona, petsociety.categoria categoria, petsociety.ubicacion ubicacion, petsociety.usuario usuario, petsociety.mascota mascota WHERE destino.ID_USUARIO=? AND destino.ID_LUGAR=lugar.ID_LUGAR AND zona.ID_ZONA=ubicacion.ID_ZONA AND categoria.ID_CATEGORIA=lugar.ID_CATEGORIA AND ubicacion.ID_UBICACION=lugar.ID_UBICACION AND usuario.ID_USUARIO=destino.ID_USUARIO AND mascota.ID_MASCOTA=destino.ID_MASCOTA";
		try{
		stat = conn.prepareStatement(sql);
		stat.setInt(1, idUsuario);
		
		resultSet= stat.executeQuery();
		
		while(resultSet.next()){
			 destino=new Destino();

			 Integer anyo=resultSet.getDate("HORA").getYear()+1900;
			 Date hora= new Date(anyo, resultSet.getDate("HORA").getMonth(), resultSet.getDate("HORA").getDate(), resultSet.getTime("HORA").getHours(), resultSet.getTime("HORA").getMinutes());
			 destino.setHora(hora);
			 //obtener categoria
			 String categoria=resultSet.getString("categoria.NOMBRE");
			 
			 //obtener lugar
			 Lugar lugar=new Lugar();
						 
			if(categoria.equals("Parque publico")){
				lugar= new Parque();
			}else if(categoria.equals("Clinica veterinaria")){
				lugar= new Veterinario();
			}else if(categoria.equals("Tienda de mascotas")){
				lugar= new Tienda();
			}
			
			 
			 lugar.setIdLugar(resultSet.getInt("ID_LUGAR"));
			 lugar.setNombre(resultSet.getString("lugar.NOMBRE"));
			 
			 //obtener ubicacion
			 lugar.setUbicacion(ubicacionDAO.selectUbicacion(conn,resultSet.getInt("ubicacion.ID_UBICACION")));
			 
			 //obtener mascota
			 destino.setMascota(mascotaDAO.selectMascota(conn,resultSet.getInt("mascota.ID_MASCOTA")));
			 
			 destino.setVoy(lugar);
			 
			 lista.add(destino);
		}
		
		
		} catch(SQLException e) { 
			System.out.println("selectDestino Message: " + e.getMessage());
	        System.out.println("selectDestino SQLState: " + e.getSQLState());
	        System.out.println("selectDestino ErrorCode: " + e.getErrorCode());
			
		} finally {
			try {
				if (resultSet != null) {
					resultSet.close();
				}
				if (stat != null) {
					stat.close();
				}
			} catch (Exception e) {
			}
		}
	return lista;	
	}

	public boolean insertDestino(int idUsuario, int idMascota,int idDestino) {
		Connection conn= ConnectionManager.getInstance().CheckOut();
		PreparedStatement stmt=null;

		
		String sql = "INSERT INTO petsociety.destino" +
				" (ID_USUARIO, HORA, ID_LUGAR, ID_MASCOTA)"+
				" VALUES (?, ?, ?, ?)";
		
		try{
			
			stmt = conn.prepareStatement(sql);
						
			
			Calendar cal= Calendar.getInstance();
			Integer anyo=cal.getTime().getYear()+1900;
			String tiempo=anyo + "-"+cal.getTime().getMonth() +"-"+ cal.getTime().getDate() + " " +cal.getTime().getHours() + ":" +cal.getTime().getMinutes() +":" + cal.getTime().getSeconds();
			
			stmt.setInt(1, idUsuario);
			stmt.setString(2, tiempo);
			stmt.setInt(3, idDestino);
			stmt.setInt(4, idMascota);


			stmt.executeUpdate();
			
		} catch (SQLException e) {
            System.out.println("insertDestino Message: " + e.getMessage());
            System.out.println("insertDestino SQLState: " + e.getSQLState());
            System.out.println("insertDestino ErrorCode: " + e.getErrorCode());
        } finally {
        	ConnectionManager.getInstance().CheckIn(conn);
            try {
            	
                if (stmt != null) 
                    stmt.close();
                
            } catch (SQLException e) {
            }
        }		
		
		
		
		return true;
		
	}
	
	
}
